package negocio;

import java.util.Date;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.DiscriminatorColumn;
import javax.persistence.DiscriminatorType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.JoinColumn;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table;

import org.hibernate.annotations.LazyCollection;
import org.hibernate.annotations.LazyCollectionOption;

@Entity
@Table(name="LVTP_PEDIDOS")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="DISCRIMINADOR", discriminatorType=DiscriminatorType.STRING)
@org.hibernate.annotations.ForceDiscriminator
public abstract class Pedido
{
	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	@Column (name="ID_PEDIDO")
	private Integer codigo;
	@Column (name="FECHA_INICIO")
	private Date fechaInicio;
	@Column (name="FECHA_FIN")
	private Date fechaFin;
	
	@OneToOne
	@JoinColumn(name="ID_CONDICION_PAGO")
	private CondicionDePago condicionDePago;
	
	@Column (name="DESCUENTO")
	private Float descuento;
	
	@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.LAZY)
	@LazyCollection(LazyCollectionOption.FALSE)
	@JoinColumn(name="ID_PEDIDO")
	private Set<PedidoItem> items;
	
	public Pedido()
	{
		items = new HashSet<PedidoItem>();
	}
	
	public Integer getCodigo() {
		return codigo;
	}
	public void setCodigo(Integer codigo) {
		this.codigo = codigo;
	}
	public Date getFechaInicio() {
		return fechaInicio;
	}
	public void setFechaInicio(Date fechaInicio) {
		this.fechaInicio = fechaInicio;
	}
	public Date getFechaFin() {
		return fechaFin;
	}
	public void setFechaFin(Date fechaFin) {
		this.fechaFin = fechaFin;
	}
	
	public CondicionDePago getCondicionDePago() {
		return condicionDePago;
	}

	public void setCondicionDePago(CondicionDePago condicionDePago) {
		this.condicionDePago = condicionDePago;
	}

	public Float getDescuento() {
		return descuento;
	}

	public void setDescuento(Float descuento) {
		this.descuento = descuento;
	}

	public Set<PedidoItem> getItems() {
		return items;
	}

	public void setItems(Set<PedidoItem> items) {
		this.items = items;
	}
	
	public PedidoItem obtenerItem(Producto producto, Integer cantidad){
		return obtenerItem(producto.getCodigo(), cantidad);
	}
	
	public PedidoItem obtenerItem(Integer codigoProducto, Integer cantidad)
	{
		Iterator<PedidoItem> i = items.iterator();
		while(i.hasNext())
		{
			PedidoItem item = i.next();
			if (item.getProducto().getCodigo().equals(codigoProducto) && item.getCantidad().equals(cantidad))
				return item;
		}
		return null;	
	}
	
	public boolean estaVigente(){
		Date hoy = new Date();
		return (fechaInicio.before(hoy) && (fechaFin==null || fechaFin.after(hoy)));
	}
	
	public boolean equals(Object obj)
	{
		if (obj != null && this.getClass().isInstance(obj)){
			Pedido tmp = (Pedido)obj;
			return codigo.equals(tmp.getCodigo());
		}
		return false;
	}
}
